#include <stdio.h>
#include <stdlib.h>

void Print1(char** str, int start, int layer, int num, char** str1);
int count = -1;//记录递归进入的层数
int main()
{
    int n, i, j, k, sz;
    scanf("%d", &n);
    //序偶总个数
    sz = n * n;
    //将换行符读出缓存区
    getchar();
    //分配临时空间存储集合
    char* tem = (char*)calloc(2*n + 2, sizeof(char));
    if (tem == NULL)
    {
        perror("calloc");
        return -1;
    }
    scanf("%s", tem);
    //分配空间存储元素
    char* str = (char*)calloc(n, sizeof(char));
    //从临时空间读入元素
    for (i = 0; i < n; i++)
        str[i] = tem[2*i + 1];
    //销毁临时空间
    free(tem), tem = NULL;
    //分配空间存储所有序偶
    char** str1 = (char**)calloc(sz, sizeof(char*));
    for (i = 0; i < sz; i++)
        str1[i] = (char*)calloc(2*n + 2, sizeof(char));
    //向空间中写入序偶
    for (i = 0, k = 0; i < n; i++)
    {
        for (j = 0; j < n; j++)
            sprintf(str1[k], "<%c,%c>", str[i], str[j]), k++;
    }
    // //打印检查序偶是否书写成功
    // for (i = 0; i < sz; i++)
    //     printf("%s", str1[i]);
    
    //输出关系的集合
    // printf("{}\n");
    // for (i = 0; i < sz; i++)
    //     printf("{%s}\n", str1[i]);
    // for (i = 1; i < sz; i++)
    // {
    //     for (j = 0; j < sz - i; j++)
    //     {
    //         count = 1;
    //         //str1是要处理的集合元素，j是开始循环打印的位置，i+1是循环层数，num是集合元素个数
    //         Print(str1, j, i + 1, sz);
    //     }   
    // }
    char** str2 = NULL;
    printf("{}\n");
    for (i = 1; i <= sz; i++)
    {
        // count = 0;
        if (i > 1)
        {
            char** temp = (char**)calloc(i - 1, sizeof(char*));
            if (temp == NULL)
            {
                perror("calloc");
                return 0;
            }
            str2 = temp;
        }
        for (j = 0; j < i - 1; j++)
            str2[j] = (char*)calloc(2*n + 2, sizeof(char));
        Print1(str1, 0, i, sz, str2);
        // for (k = 0; k < i - 1; k++)
        //     free (str2[k]), str2[k] = NULL;
        // free(str2);
    }
    // free(str), str = NULL;
    if (sz > 1)
    {
        for (i = 0; i < sz; i ++)
        {
            free (str1[i]), str1[i] = NULL;
        }
    }
    free (str1);//输入元素个数为1时，程序会在循环中的释放停下


    return 0;
}
//从二层循环开始，集合子集的打印可以看做是前面打印的元素是确定的，只有最后一个打印的元素是循环打印
//n是循环打印的开始，layer是循环打印的层数，num是待打印集合的个数
// void Print(char** str, int n, int layer, int num)
// {
//     int i;
//     if (layer == count)
//     {
//         for (i = n; i < num; i++)
//         {
//             printf("{");
//             if (layer > 1)
//             {
//                 for (int k = n - layer + 1; k < n; k++)
//                     printf("%s", str[k]);
//             }
//             printf("%s", str[i]);
//             printf("}\n");
//         }
//         return;
//     }
//     else
//     {
//         count++;
//         Print(str, n + 1, layer - 1, num);
//     }
// }
// void Print1(char** str, int n, int layer, int num, char** str1)
// {
//     int i, j, k;
//     if (1 == layer)
//     {
//         for (i = 0; i < num; i++)
//             printf("{%s}\n", str[i]);
//     }
//     else if (2 == layer)
//     {
//         for (i = n + 1; i <= num - 2; i++)
//         {
//             for (j = i + 1; j < num; j++)
//             {
//                 printf("{");
//                 // if (0 == count)
//                 //     printf("{%s,%s}\n", str[i], str[j]);
//                 // else
//                 //     printf("%s,%s}\n", str[i], str[j]);
//                 for (k = n - count; k < n; k++)
//                     printf("%s,", str[k]);
//                 printf("%s,%s}\n", str[i], str[j]);
//             }
//         }
//     }
//     else
//     {
//         count++;
//         for (i = n; i <= num - layer; i++)
//         {
//             Print1(str, n, layer-1, num);
//         }
//     }
//     return ;
// }
void Print1(char** str, int start, int layer, int num, char** str1)
{
    int i, j, k;
    if (1 == layer)
    {
        for (i = start; i < num; i++)
        {
            printf("{");
            for (j = 0; j <= count; j++)
                printf("%s,", str1[j]);
            printf("%s}\n", str[i]);
        }
    }
    else
    {
        count++;
        for (i = start; i <= num - layer; i++)
        {
            str1[count] = str[i];
            Print1(str, i + 1, layer - 1, num, str1);
        }
        count--;
    }
}